iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Security

資安菜鳥的30天挑戰系列 第 21

[DAY21]我拿你的通行證來用!

  • 分享至 

  • xImage
  •  

跨站請求偽造是甚麼?

📌 想像你有張「銀行通行證」,只要帶著它銀行就相信你是本人,可以轉帳

CSRF 就像有人在你不知情時,把你帶到銀行櫃檯

利用你沒拔掉的通行證替他轉帳,你本人其實沒有按確認

但因為銀行只看那張通行證,就以為是你授權的動作

攻擊方

  1. 找到受害者已登入且會保留 session 的網站

  2. 製作一個惡意頁面或郵件,當受害者在已登入狀態下打開時

    該頁面自動發送一個「請求」到受害網站

  3. 請求帶有受害者的 cookie 或 session

    目標伺服器誤以為是真正使用者的操作而執行

防禦方

  • Anti-CSRF Token(同步 token):在表單中放一個 server 產生、難以猜測且與 session 綁定的隨機 token,伺服器驗證 token 才執行操作
  • SameSite Cookie 屬性:設定 Set-Cookie: SameSite=Lax/Strict,避免跨站點請求攜帶 cookie(Lax 對 GET 有例外,Strict 最嚴)
  • 要求額外驗證(step-up):對高風險操作要求再次輸入密碼或 MFA
  • 避免敏感操作使用 GET:把會改變狀態的操作限定為 POST 並要求 CSRF token
  • CORS 與 API 設計:對 API 使用適當的 CORS 策略與授權機制(不要單靠 cookie 認證跨站 API)

範例

伺服器未驗證 CSRF

<body onload="document.forms[0].submit()">
  <form action="https://bank.example/transfer" method="POST">
    <input name="to" value="attacker_account">
    <input name="amount" value="1000">
  </form>
</body>

受害者若已登入 bank.example 並在同瀏覽器有有效 cookie

這個表單會自動送出,銀行可能會執行轉帳

加入 CSRF token

伺服器在登入時生成 csrf_token 並把它放在 session 中

<form action="/transfer" method="POST">
  <input name="to" value="someone">
  <input name="amount" value="100">
  <input type="hidden" name="csrf_token" value="RANDOM_SERVER_TOKEN">
  <button>Transfer</button>
</form>

伺服器收到 POST 時檢查 csrf_token 是否與 session 中一致

偵測指標

  • 大量在短時間內從外部網站發起的 POST 請求(尤其沒有或有錯誤 CSRF token)
  • 成功執行的敏感操作其 HTTP Referer/Origin 為外部域或為空(視情況警示)
  • 使用者在短時間內發起多筆非典型轉帳或設定改動(UBA 異常)
  • 日誌中出現缺少 CSRF token 或 token 驗證失敗的次數急遽上升 → 觸發告警

結論

📌 跨站請求偽造(CSRF)利用瀏覽器會自動帶上 cookie 的特性

讓攻擊者在受害者不知情下發起對受信任網站的請求

而達成未經授權的狀態變更或金融詐騙

防禦在於「伺服器端不信任單靠 cookie 的請求」

採用 CSRF token、嚴謹的 cookie 屬性(HttpOnly)

📌 日誌監控能在攻擊發生時快速偵測與緩解


上一篇
[DAY20]偷偷聽著妳們的對話!
下一篇
[DAY22]我來送菜了!
系列文
資安菜鳥的30天挑戰23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言